* render on the Cairo context; otherwise we just go through the old
* GtkWidget::draw path
*/
- if (widget_class->get_render_node != NULL)
+ if (widget_class->snapshot != NULL)
+ {
+ GskRenderer *renderer = gtk_widget_get_renderer (widget);
+ GtkSnapshot snapshot;
+ GskRenderer *fallback;
+ graphene_rect_t viewport;
+ GskRenderNode *node;
+
+ graphene_rect_init (&viewport,
+ widget->priv->allocation.x - widget->priv->clip.x,
+ widget->priv->allocation.y - widget->priv->clip.y,
+ widget->priv->clip.width,
+ widget->priv->clip.height);
+ fallback = gsk_renderer_create_fallback (renderer, &viewport, cr);
+ gtk_snapshot_init_root (&snapshot, renderer);
+ node = gtk_widget_snapshot (widget, &snapshot);
+ if (node != NULL)
+ {
+ gsk_renderer_render (fallback, node, NULL);
+ gsk_render_node_unref (node);
+ }
+ gtk_snapshot_finish (&snapshot);
+
+ g_object_unref (fallback);
+ }
+ else if (widget_class->get_render_node != NULL)
{
GskRenderer *renderer = gtk_widget_get_renderer (widget);
GskRenderer *fallback;
/* Compatibility mode: if the widget does not have a render node, we draw
* using gtk_widget_draw() on a temporary node
*/
- if (klass->get_render_node == NULL)
+ if (klass->get_render_node == NULL &&
+ klass->snapshot == NULL)
{
GskRenderNode *tmp;
cairo_t *cr;
}
else
{
- node = klass->get_render_node (widget, gtk_snapshot_get_renderer (snapshot));
+ if (klass->snapshot)
+ node = klass->snapshot (widget, snapshot);
+ else
+ node = klass->get_render_node (widget, gtk_snapshot_get_renderer (snapshot));
/* Compatibility mode: if there's a ::draw signal handler, we add a
* child node with the contents of the handler
#include <gsk/gsk.h>
#include <gtk/gtkaccelgroup.h>
#include <gtk/gtkborder.h>
+#include <gtk/gtksnapshot.h>
#include <gtk/gtktypes.h>
#include <atk/atk.h>
GskRenderNode *(* get_render_node) (GtkWidget *widget,
GskRenderer *renderer);
+ GskRenderNode *(* snapshot) (GtkWidget *widget,
+ const GtkSnapshot *snapshot);
/*< private >*/